# _*_ coding : utf-8 _*_
# @Time : 2025/3/28 20:23
# @Author : 梁满仓
# @File : breaking_through_ma7
# @Project : stock_of_donnie_day_day_up

import akshare as ak
import pandas as pd
from datetime import datetime


def get_all_history_data(stock_code):
    """
    获取股票上市以来的所有后复权数据
    :param stock_code: 股票代码，如'sh600000'或'sz000001'
    :return: 包含历史数据的DataFrame
    """
    try:
        # 获取后复权数据
        df = ak.stock_zh_a_daily(symbol=stock_code, adjust="hfq")
        df.reset_index(inplace=True)
        df.rename(columns={'date': '日期', 'close': '收盘'}, inplace=True)
        df['日期'] = pd.to_datetime(df['日期'])
        df = df.sort_values('日期')
        df['7日均线'] = df['收盘'].rolling(7, min_periods=7).mean()
        df.to_csv('get_all_history_data.csv', index=False, encoding='utf_8_sig')
        return df
    except Exception as e:
        print(f"获取股票{stock_code}数据失败: {e}")
        return None


def find_first_breakthrough_dates(df):
    """
    找出所有首次突破7日均线并在第二天站稳的日期
    :param df: 包含股票历史数据的DataFrame
    :return: 包含突破日期的DataFrame
    """
    if df is None or len(df) < 8:  # 至少需要8天数据来计算7日均线
        return pd.DataFrame()

    breakthrough_dates = []
    found_breakthrough = False

    # 从第8天开始检查（因为有7日均线）
    for i in range(7, len(df) - 1):
        current_day = df.iloc[i]
        next_day = df.iloc[i + 1]

        # 检查是否首次突破7日均线
        # 条件1: 当天收盘价突破7日均线
        condition1 = current_day['收盘'] > current_day['7日均线']

        # 条件2: 前一天收盘价在7日均线下方
        condition2 = df.iloc[i - 1]['收盘'] <= df.iloc[i - 1]['7日均线']

        # 条件3: 第二天站稳在7日均线上方
        condition3 = next_day['收盘'] > next_day['7日均线']

        # 条件4: 之前没有满足条件的记录（首次突破）
        condition4 = not found_breakthrough

        if condition1 and condition2 and condition3 and condition4:
            breakthrough_dates.append({
                '首次突破日期': current_day['日期'].strftime('%Y-%m-%d'),
                '站稳确认日期': next_day['日期'].strftime('%Y-%m-%d'),
                '突破日收盘价': round(current_day['收盘'], 2),
                '突破日7日均线': round(current_day['7日均线'], 2),
                '站稳日收盘价': round(next_day['收盘'], 2),
                '站稳日7日均线': round(next_day['7日均线'], 2),
                '突破幅度(%)': round((current_day['收盘'] / current_day['7日均线'] - 1) * 100, 2)
            })
            found_breakthrough = True

    return pd.DataFrame(breakthrough_dates)


if __name__ == "__main__":
    # 输入股票代码，例如"sh600000"或"sz000001"
    stock_code = input("请输入股票代码(如sh600000): ").strip()
    print(stock_code)

    print(f"正在获取{stock_code}上市以来的所有后复权数据...")
    df = get_all_history_data(stock_code)

    if df is not None:
        print(f"\n正在分析{stock_code}的首次突破7日均线并站稳的日期...")
        result = find_first_breakthrough_dates(df)

        if not result.empty:
            print(f"\n{stock_code}历史上首次突破7日均线并站稳的日期:")
            print(result.to_string(index=False))

            # 保存结果到CSV
            csv_file = f"{stock_code}_首次突破7日均线.csv"
            result.to_csv(csv_file, index=False, encoding='utf_8_sig')
            print(f"\n结果已保存到: {csv_file}")
        else:
            print(f"\n{stock_code}历史上未找到首次突破7日均线并站稳的情况")
    else:
        print("无法获取股票数据，请检查股票代码是否正确")